package cn.good.yan.service.t5.bloom;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 布隆过滤器
 * 初始化 - 将一些对象存入在布隆过滤器中
 * 白名单业务默认规定：布隆过滤器有，redis 有可能有值， 布隆过滤器无 redis一定没有值
 * @author shengren.yan
 * @create 2023-11-26
 */
@Component
@Slf4j
public class BloomFilterInit {

    @Resource
    private RedisTemplate redisTemplate;

    // 该布隆过滤器的key名
    public static final String bKey = "whitelistCustomer";

    /**
     * 初始化白名单数据
     */
    @PostConstruct
    public void init() {
        // 1.白名单客户加载到布隆过滤器
        String key = "customer:11";
        // 2.计算hashValue，由于存在计算出来负数的可能，取绝对值
        int hashValue = Math.abs(key.hashCode());
        // 3.通过hashValue 和 2的32次方后取余，获得对应的下标坑位
        long index = (long) (hashValue % Math.pow(2, 32));
        log.info(key + "对应的坑位 index： {}", index);
        // 4.设置redis里面的bitmap对应类型的坑位，将该值设置为1
        redisTemplate.opsForValue().setBit(bKey, index, true);
    }

}
